package ua.diploma.login;

import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;

import org.apache.log4j.Logger;

import ua.diploma.chat.UserAlreadyRegisteredException;
import ua.diploma.chat.UserNotRegisteredException;
import ua.diploma.core.PasswordEncryptor;
import ua.diploma.core.ServiseFactory;
import ua.diploma.hibernate.dao.DAOFactory;
import ua.diploma.hibernate.dto.User;

/**
 * Реализация сервиса для обработки событий аутентификации и прекращения сессии
 * 
 * @author netstalk3r
 * 
 */
public class LoginServiceImpl implements LoginService {

	/**
	 * логгер
	 */
	private static final Logger log = Logger.getLogger(LoginServiceImpl.class);

	/**
	 * Конструктор по умоланию
	 */
	public LoginServiceImpl() {
		super();
	}

	@Override
	public User logIn(String userName, String password)
			throws AuthenticationException {
		try {
			User user = DAOFactory.getUserDAO().getUserByLogin(userName);
			if (user == null)
				throw new AuthenticationException(
						"Неверное имя пользователя или пароль");
			Integer id = user.getId();
			log.info("Юзер: " + userName + ", id: " + id);
			PasswordEncryptor encryptor =  new PasswordEncryptor();
			String encryptedPassword = encryptor.encrypt(password);
			if (!user.getPassword().equals(encryptedPassword)) {
				throw new AuthenticationException(
						"Неверное имя пользователя или пароль");
			}
			ServiseFactory.getChatServise().registerUser(userName);
			return user;
		} catch (SQLException e) {
			log.error("ошибка работы с дб ", e);
			throw new AuthenticationException("ошибка работы с дб ", e);
		} catch (NoSuchAlgorithmException e) {
			log.error("ошибка шифрования " + e);
		} catch (UserAlreadyRegisteredException e) {
			log.error("Попытка авторизировать уже авторизированного юзера ", e);
			throw new AuthenticationException("Попытка авторизировать уже авторизированного юзера ", e);
		}
		return null;
	}

	@Override
	public void logOut(String userName) {
		try {
			ServiseFactory.getChatServise().unRegisterUser(userName);
		} catch (UserNotRegisteredException e) {
			log.warn("Магическим образом юзер уже не в чате. ", e);
		}

	}

}
